DROP TABLE ProdutoVenda;

DROP TABLE ProdutoCompra;

DROP TABLE Compra;

DROP TABLE Venda;

DROP TABLE Login;

DROP TABLE PessoaTelefone;

DROP TABLE Produto;

DROP TABLE Pessoa;

CREATE TABLE Pessoa (
  idPessoa INTEGER  NOT NULL  ,
  representante INTEGER  NOT NULL  ,
  cpf VARCHAR(20)  NOT NULL  ,
  cnpj VARCHAR(20)    ,
  nome VARCHAR(100)  NOT NULL  ,
  endereco VARCHAR(200)    ,
  rg VARCHAR(11)    ,
  cep VARCHAR(8)    ,
  estado VARCHAR(20)    ,
  cidade VARCHAR(60)    ,
  bairro VARCHAR(60)    ,
  email VARCHAR(100)    ,
  insc_estadual INTEGER    ,
  banco VARCHAR(50)    ,
  conta INTEGER    ,
  agencia INTEGER      ,
PRIMARY KEY(idPessoa)  ,
  FOREIGN KEY(representante)
    REFERENCES Pessoa(idPessoa));
GO


CREATE INDEX IDX_FK_PessoaRepresentante ON Pessoa (representante);
GO


CREATE INDEX IFK_Pessoa_Representate ON Pessoa (representante);
GO


CREATE TABLE Produto (
  idProduto INTEGER  NOT NULL   IDENTITY ,
  codigoBarra INTEGER  NOT NULL  ,
  naturezaCFOP INTEGER    ,
  nome VARCHAR(100)    ,
  apelido VARCHAR(100)    ,
  ncm INTEGER    ,
  precoNota NUMERIC(10,2)    ,
  precoReal NUMERIC(10,2)    ,
  ipi INTEGER    ,
  unidade VARCHAR(10)    ,
  icms INTEGER    ,
  precoVenda NUMERIC(10,2)    ,
  descontoMaximo INTEGER    ,
  dataVencimento DATE    ,
  lote INTEGER      ,
PRIMARY KEY(idProduto));
GO




CREATE TABLE PessoaTelefone (
  idTelefone INTEGER  NOT NULL   IDENTITY ,
  telefone VARCHAR(15)  NOT NULL  ,
  pessoa INTEGER  NOT NULL    ,
PRIMARY KEY(idTelefone)  ,
  FOREIGN KEY(pessoa)
    REFERENCES Pessoa(idPessoa));
GO


CREATE INDEX IDX_FK_PessoaTelefonePessoa ON PessoaTelefone (pessoa);
GO


CREATE INDEX IFK_Pessoa_Telefone ON PessoaTelefone (pessoa);
GO


CREATE TABLE Login (
  pessoa INTEGER  NOT NULL  ,
  usuario VARCHAR(60)  NOT NULL  ,
  senha VARCHAR(50)  NOT NULL    ,
PRIMARY KEY(pessoa)  ,
  FOREIGN KEY(pessoa)
    REFERENCES Pessoa(idPessoa));
GO


CREATE INDEX IDX_FK_LoginIdPessoa ON Login (pessoa);
GO


CREATE INDEX IFK_Funcionario_Login ON Login (pessoa);
GO


CREATE TABLE Venda (
  numeroNota INTEGER  NOT NULL  ,
  funcionario INTEGER  NOT NULL  ,
  cliente INTEGER  NOT NULL  ,
  modelo CHAR(2)    ,
  dataEmissao DATE    ,
  dataSaida DATE    ,
  naturezaCFOP INTEGER    ,
  valorTotal NUMERIC(10,2)    ,
  desconto NUMERIC(10,2)    ,
  quantidade INTEGER    ,
  valorUnitario NUMERIC(10,2)    ,
  valorTotalProduto NUMERIC(10,2)    ,
  statusVenda VARCHAR(10)      ,
PRIMARY KEY(numeroNota)    ,
  FOREIGN KEY(cliente)
    REFERENCES Pessoa(idPessoa),
  FOREIGN KEY(funcionario)
    REFERENCES Pessoa(idPessoa));
GO


CREATE INDEX IDX_FK_VendaCliente ON Venda (cliente);
GO
CREATE INDEX IDX_FK_VendaFuncionario ON Venda (funcionario);
GO


CREATE INDEX IFK_Cliente_Venda ON Venda (cliente);
GO
CREATE INDEX IFK_Funcionario_Venda ON Venda (funcionario);
GO


CREATE TABLE Compra (
  numeroNota INTEGER  NOT NULL  ,
  funcionario INTEGER  NOT NULL  ,
  fornecedor INTEGER  NOT NULL  ,
  dataEmissao DATE    ,
  baseCalculoST NUMERIC(10,2)  NOT NULL  ,
  valorNota NUMERIC(10,2)    ,
  baseCalculoIcms NUMERIC(10,2)    ,
  valorIcms NUMERIC(10,2)    ,
  valorST NUMERIC(10,2)    ,
  statusCompra VARCHAR(20)      ,
PRIMARY KEY(numeroNota)    ,
  FOREIGN KEY(fornecedor)
    REFERENCES Pessoa(idPessoa),
  FOREIGN KEY(funcionario)
    REFERENCES Pessoa(idPessoa));
GO


CREATE INDEX IDX_FK_CompraFornecedor ON Compra (fornecedor);
GO
CREATE INDEX IDX_FK_CompraFuncionario ON Compra (funcionario);
GO


CREATE INDEX IFK_Fornecedor_Compra ON Compra (fornecedor);
GO
CREATE INDEX IFK_Funcionario_Compra ON Compra (funcionario);
GO


CREATE TABLE ProdutoCompra (
  idProduto INTEGER  NOT NULL  ,
  numeroNota INTEGER  NOT NULL  ,
  preco NUMERIC(10,2)    ,
  quantidade INTEGER      ,
PRIMARY KEY(idProduto, numeroNota)  ,
  FOREIGN KEY(numeroNota)
    REFERENCES Compra(numeroNota),
  FOREIGN KEY(idProduto)
    REFERENCES Produto(idProduto));
GO


CREATE INDEX IDX_FK_ProdutoCompraNumeroNota ON ProdutoCompra (numeroNota);
GO


CREATE INDEX IFK_Compra_Produto ON ProdutoCompra (numeroNota);
GO
CREATE INDEX IFK_Produto_Compra ON ProdutoCompra (idProduto);
GO


CREATE TABLE ProdutoVenda (
  numeroNota INTEGER  NOT NULL  ,
  idProduto INTEGER  NOT NULL  ,
  preco NUMERIC(10,2)    ,
  quantidade INTEGER      ,
PRIMARY KEY(numeroNota, idProduto)    ,
  FOREIGN KEY(numeroNota)
    REFERENCES Venda(numeroNota),
  FOREIGN KEY(idProduto)
    REFERENCES Produto(idProduto));
GO


CREATE INDEX IDX_FK_ProdutoVendaNumeroNota ON ProdutoVenda (numeroNota);
GO
CREATE INDEX IDX_FK_ProdutoVendaIdProduto ON ProdutoVenda (idProduto);
GO


CREATE INDEX IFK_Venda_Venda ON ProdutoVenda (numeroNota);
GO
CREATE INDEX IFK_Produto_Venda ON ProdutoVenda (idProduto);
GO



